Importación sencilla de XML a mySQL con PHP
Ultimamente he tenido que realizar algunas pruebas de importación de datos provenientes de un fichero XML a tablas de una base de datos en mySQL. Y bueno con PHP 5 me resultó bastante sencillo, ya que incorpora (por defecto) la extensión simpleXML que facilita mucho las cosas. Para este ejemplo necesitaremos crear 2 ficheros en php, uno con la configuración y conexión a la base de datos, y otro con el script de importación en si. Además del fichero XML que vamos a importar. Y evidentemente necesitaremos tener creada las tablas a la que vamos a importar. Empecemos mostrando la estructura del fichero XML a importar. XLT-5841AHJ 29.95 Editorial Planeta Nunca es tarde para aprender J.M.Navarro Ensayo sobre la necesidad de estar en constante fase de aprendizaje a lo largo de nuestra vida, su repercusión en nuestra vida, en todas sus etapas y los beneficios que ello reportar sobre nuestra salud tanto mental como física http://images.leemiblog.com/1_large.jpg Portada grande http://images.leemiblog.com/2_large.jpg Contraportada http://images.leemiblog.com/foto_autor.jpg Foto del autor . . . . . . Partiendo de esta estructura de nuestro fichero XML a importar deberemos crear nuestro script para que sea capaz de importar estos datos directamente en una tabla mysql que tendremos que haber creado anteriormente. Además dicha base de datos deberá incorporar al menos dos tablas para que sea capaz de incorporar eficientemente esta estructura en la que un libro tiene asociada una serie de imágenes, aunque podríamos hacerlo con una sola en la que tener triplicados los campos url de la imagen y su descripción, me ha parecido más didáctico e interesante hacerlo en dos tablas. Dando así solución a un problema bastante común como la división en distintas tablas de un único fichero XML. Ahora veremos el código php necesario para realizar la importación. En primer lugar tendremos un fichero de configuración con los datos de conexión y los comandos necesarios para realizar dicha conexión a la base de datos mySql. /*************************************************************** * Conection Params Page - config.php * Author: J. Manuel Navarro ( http://www.manuelnavarro.com ) * * Parametros de conexión a la base de datos. ***************************************************************/ A este fichero pocos comentarios, así que pasaremos al script de importación no si antes comentar que las tablas tienen un campo ID de tipo entero, definida como clave primaria y con auto-incremento. Así que al añadir el libro a la tabla necesitaremos recuperar dicho ID (generado automaticamente) para relacionar el último libro añadido con las imagenes. /*************************************************************** * Conection Params Page - importxml.php * Author: J. Manuel Navarro ( http://www.manuelnavarro.com ) * * Script ejemplo de importación de XML a mySql con PHP 5 ***************************************************************/ // Variable con el nombre del fichero a importar $xml_file = 'libros.xml'; if (file_exists($xml_file)) { $xml = simplexml_load_file($xml_file); } else { exit('Error al intentar abrir el fichero '.$xml_file); } // Todo bien asi que abrimos BD para importar require 'config.php'; /* Recorremos el XML */ $count=0; foreach ($xml->libro as $libro) { // Inserta el libro en la tabla $qry = "INSERT INTO libros ". "(codigo, titulo, editorial, autor, descripcion,precio)". " VALUES ('$libro->ref', ". "'$libro->titulo', ". "'$libro->editorial', ". "'$libro->autor', ". "'$libro->desc', ". $libro->precio.")"; // Ahora ejecutamos el INSERT en la BD $result = mysql_query($qry) or die(mysql_error()); // Y necesitamos recuperar el ultimo ID para relacionar sus imagenes $libro_id = mysql_insert_id (); // Y ahora sus imágenes (en este caso tiene 3) for ($i=1;$i<=3;$i++) { $img_url = $libro->images->image$i->url; $img_des = $libro->images->image$i->titulo; $qry = "INSERT INTO img_libros (libro_id, url, descripcion) ". "VALUES ($libro_id, '$img_url', '$img_des')"; $result = mysql_query($qry) or die(mysql_error()); } // Incrementamos contado para ver cuantos libros se importan. $count++; } echo " "; echo "------------------------------------------- "; echo "Total de libros importados: $count properties "; echo "------------------------------------------- "; ?> Las funciones claves para la importacion son simplexml_load_file que carga el fichero XML interpretandolo como un objeto, lo cual simplifica mucho su manipulación, permitiendonos recorrer todo el fichero con la función en PHP "foreach ($xml->libro as $libro)" teniendo así para cada registro de un libro en el XML la oportunidad de obtener sus valores a través de la variable $libro la cual es un objeto con todas las propiedades definidas en el XML. El resto del código se encarga de inserta el registro en la base de datos y luego recorremos las imágenes del libro para igualmente insertarlas en la correspodiente tabla. Destacando aquí el uso de la función mysql_insert_id() para obtener el valor del ID del último registro insertado en la tabla libros. CREATE TABLE `libros` ( `id` int(4) unsigned NOT NULL auto_increment, `codigo` varchar(15) default NULL, `titulo` varchar(30) default NULL, `editorial` varchar(25) NOT NULL, `autor` varchar(30) default NULL, `descripcion` varchar(500) default NULL, `precio` decimal(10,0) default NULL, PRIMARY KEY (`id`) ); CREATE TABLE `img_libros` ( `id` int(4) NOT NULL auto_increment, `libro_id` int(4) NOT NULL, `url` varchar(250) NOT NULL, `descripcion` varchar(30) default NULL, PRIMARY KEY (`id`) );